package funcs

import (
	"bytes"
	log "github.com/YoungPioneers/blog4go"
	"os/exec"
)

/**
通过linux系统的ss -an的方式来获取tcp链接数
 */

func ShowStatus(white_ip string) string {
	//str1:="10.0.10.113|"
	//组装ss -an命令
	/*	ss -an | \
		egrep -v "LISTEN" | \
		awk '{print $5}' | \
		grep -P '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' -o | \
		sort | \
		uniq -c | \
		sort -rn | \
		head

	
	ss -an | \
egrep -v "LISTEN" | \
awk '{print $5}' | \
egrep -v "127.0.0.1"


	*/

	//问题一：
	/*
	由于之前使用的命令是：

	ss -an | \
		egrep -v "LISTEN" | \
		awk '{print $5}' | \
		grep -P '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' -o | \
		sort | \
		uniq -c | \
		sort -rn | \
		head

	而该命令在ss -an后就开始了egrep -v "ip1|ip2|ip3|LISTEN"的过滤，导致会过滤掉  Local Address:Port 这一列中的白名单中的ip，而这一列都是我们本地IP，自然会全部过滤，
	所以最终是什么IP也拦截不到，需要重新设计命令

ss -an | \
egrep -v "LISTEN" | \
awk '{print $5}' | \
egrep -v "IP1|IP2|IP3|IP4" | \
grep -P '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' -o | \
sort | \
uniq -c | \
sort -rn | \
head
	*/

	var buf bytes.Buffer
	//当白名单非空的时候，才组装命令，否则直接使用下面的字符串
	if len(white_ip) != 0 {
		buf.WriteString(`ss -an | \`)
		buf.WriteString(`egrep -v "LISTEN" | \`)
		buf.WriteString(`awk '{print $5}' | \`)
		buf.WriteString(`egrep -v "`)
		buf.WriteString(white_ip)
		buf.WriteString(`" | \`)
		buf.WriteString(`grep -P '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' -o | \
sort | \
uniq -c | \
sort -rn`)
	} else {
		buf.WriteString(`ss -an | \
egrep -v "LISTEN" | \
awk '{print $5}' | \
grep -P '[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}' -o | \
sort | \
uniq -c | \
sort -rn`)

	}

	//	执行命令
	//result, err := ExecAndReturn(buf.String())
	log.Debug("Showstatus命令：", buf.String())
	cmd := exec.Command("/bin/bash", "-c", buf.String())
	result, err := cmd.CombinedOutput()

	if err != nil {
		//fmt.Println(err.Error())
		log.Error(err.Error())
	}
	//	返回结果

	return string(result)

}
